import os
from PIL import Image
import shutil
Dizhi=os.getcwd()

print("\n…………开始运行…………\n")

Dizhi=os.getcwd()               #获取当前文件所在地址


#删除程序运行中生成的"xx.png"文件
filelist=os.listdir(Dizhi)
for file in filelist:
    if 'xx.png' in file:
        del_file = Dizhi + '\\' + file #当代码和要删除的文件不在同一个文件夹时，必须使用绝对路径
        os.remove(del_file)#删除文件


#查找文件中".png"格式的文件的数量
num_png=0               #表示文件中".png"格式的文件数量
for dir_or_file in os.listdir(Dizhi):
    filePath = os.path.join(Dizhi, dir_or_file)
    # 判断是否为文件
    if os.path.isfile(filePath):
        # 如果是文件再判断是否以.png结尾，不是则跳过本次循环
        if os.path.basename(filePath).endswith('.png'):
            num_png=num_png+1

txt_h=""                    #用于承载字符串写入txt文档

PNGnum="1.png"              #定义个字符串
BMPP="unsigned char BMP1[]={"#定义个字符串   此为需要生成的函数名称

print("…………开始处理…………\n")

txt_h=txt_h+"#ifndef __bmp_H\n"+"#define __bmp_H\n"


#对命名为"1、2、3、4、5……"等数字名称的图片进行处理
for zz in range(num_png):     #循环num_png-2次，每次处理一整图片

    new_PNGnum = PNGnum.replace("1",str(zz+1))  #替换PNGnum字符串中的“1”
    new_BMPP=BMPP.replace("1",str(zz+1))        #替换BMPP字符串中的“1”
    #print(new_PNGnum)
    im = Image.open(new_PNGnum)                 #打开对应图片

    #print(im.format, im.size)
    #print(im.size[0],im.size[1])

    w, h = im.size                  #w：图片像素的宽，h：图片像素的高
    wx=w                            #
    hy=h

    
    ##转换图片尺寸至适当大小
    if(w/128 > h/64):
        if(w>128):
            w=128
            h=h//(w/128)
    else:
        if(h>64):
            h=64
            w=w//(h/64)

    
    im.thumbnail((w, h)) #改变图片尺寸
    
    im.save('xx.png', 'png') #保存为“xx.png”
    img = Image.open('xx.png') #打开“xx.png”
    w,h=img.size
    if(h-h*(h//8)!=0):
        if((h/8)>h//8+0.5):
            h=(h//8+1)
            w=int(h*(w/h))
        else:
            h=h//8*8;
            w=int(h*(w/h))
    im.thumbnail((w, h)) #改变图片尺寸
    im.save('xx.png', 'png') #保存为“xx.png”
    img = Image.open('xx.png') #打开“xx.png”
    w,h=img.size
    txt_h=txt_h+"\n\n"
    im = Image.open('xx.png') #打开“xx.png”
    im1 = im.convert('L')       #图片改为黑白图
    im1.save('xx.png', 'png') #保存为“xx.png”
    im = Image.open('xx.png')   #打开“xx.png”
    threshold = 100           #选取像素值100
     
    table = []
    for i in range(256):     #图片中的像素点的RGB值根据范围改为0或1即：黑与白
        if i < threshold:
            table.append(0)
        else:
            table.append(1)
     
    # 二值化图片：黑与白
    photo = im.point(table, '1')
    photo.save("xx.png")

    im = Image.open('xx.png')
     
    pixel=im.load()
    wide,high=im.size           #图片宽、高

    a=""                        #用于保存二进制数，以便于转化为16进制
    dat=0                       #计算a中保存的二进制位数
    hex16=0                     #计算每行输出的16进制个数

    s=0                         #从第s行开始执行
    
    txt_h=txt_h+"////pixel:"+str(w)+"*"+str(h)+"\n"
    txt_h=txt_h+new_BMPP+"\n"

    
    ########参考BMP图转化为16进制的方式，此为行列式逆向
    for z in range(high//8):    #每八行执行一循环
        for x in range(wide):       #图片宽度
            for y in reversed(range(8)): #每八个二进制位转化为一个16进制数
                if pixel[x,y+s]==255:
                    a=a+"0"
                    dat=dat+1            
                else:
                    a=a+"1"
                    dat=dat+1
                if(dat==8):
                    txt_h=txt_h+hex(int(a,2))+","
                    a=""
                    dat=0
                    hex16=hex16+1
                    if(hex16==16):
                        txt_h=txt_h+"\n"
                        hex16=0
        s=s+8
    txt_h=txt_h+"\n};"
    print("…………第",end="")
    print(zz+1,end="")
    print("张图片处理成功\n")
txt_h=txt_h+"\n#endif\n"


#将txt_h字符串写进"1.txt"文档中
file_handle=open('bmp.h',mode='w')
file_handle.write(txt_h)
file_handle.close()


#删除程序运行中生成的"xx.png"文件
##filelist=os.listdir(Dizhi)
##for file in filelist:
##    if 'xx.png' in file:
##        del_file = Dizhi + '\\' + file #当代码和要删除的文件不在同一个文件夹时，必须使用绝对路径
##        os.remove(del_file)#删除文件

print("运行结束！")
